/* 考试题目 */
/*
无参构造
无参构造
无参构造
无参构造
无参构造
无参构造
无参构造
无参构造
无参构造
无参构造
学号： 11  姓名： ampra  年龄： 49  成绩： 3.25
学号： 55  姓名： ccyyp  年龄： 83  成绩： 20.75
学号： 35  姓名： pepqg  年龄： 95  成绩： 7.75
学号： 94  姓名： ajpnb  年龄： 63  成绩： 12.5
学号： 6  姓名： npxpz  年龄： 90  成绩： 11
学号： 66  姓名： bicsa  年龄： 40  成绩： 2.75
学号： 86  姓名： qqgzl  年龄： 7  成绩： 3.25
学号： 15  姓名： tjcwk  年龄： 14  成绩： 19.5
学号： 53  姓名： rzpqy  年龄： 77  成绩： 11.25
学号： 3  姓名： hyuhl  年龄： 94  成绩： 8
---------------------------------
学号： 86  姓名： qqgzl  年龄： 7  成绩： 3.25
学号： 15  姓名： tjcwk  年龄： 14  成绩： 19.5
学号： 66  姓名： bicsa  年龄： 40  成绩： 2.75
学号： 11  姓名： ampra  年龄： 49  成绩： 3.25
学号： 94  姓名： ajpnb  年龄： 63  成绩： 12.5
学号： 53  姓名： rzpqy  年龄： 77  成绩： 11.25
学号： 55  姓名： ccyyp  年龄： 83  成绩： 20.75
学号： 6  姓名： npxpz  年龄： 90  成绩： 11
学号： 3  姓名： hyuhl  年龄： 94  成绩： 8
学号： 35  姓名： pepqg  年龄： 95  成绩： 7.75
析构函数
析构函数
析构函数
析构函数
析构函数
析构函数
析构函数
析构函数
析构函数
析构函数
*/
#include <iostream>
#include <vector>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <algorithm>

using namespace std;

/* 类的定义 */
class Student
{
    friend Student *setValue(void);
    friend void showStudent(Student &s);
    friend bool myCompare(Student *s1, Student *s2);
public:
    Student();
    Student(int id, char *name, int age, double score);
    Student(const Student &ob);
    ~Student();

private:
    int id;             /* 学号 */
    char *name;         /* 名字 */
    int age;            /* 年龄 */
    double score;       /* 成绩 */
};

void showStudent(Student &s);
Student *setValue(void);
bool myCompare(Student *s1, Student *s2);

int main(int argc, char **argv)
{
    /* 变量定义 */
    vector<Student *> vec;
    vector<Student *>::iterator vit;
    Student *s = new Student[100];
    while (1);
    /* 设置随机数种子 */
    srand(time(NULL));

    /* 随机数赋值 */
    for (int i = 0; i < 10; i++)
    {
        s = setValue();

        vec.push_back(s);

    }

    /* 显示 */
    vit = vec.begin();
    for (; vit != vec.end(); vit++)
    {
        showStudent(**vit);
    }

    /* 排序 */
    sort(vec.begin(), vec.end(), myCompare);
    cout << "---------------------------------" << endl;

    /* 显示 */
    vit = vec.begin();
    for (; vit != vec.end(); vit++)
    {
        showStudent(**vit);
    }


    /* 销毁 */
    vit = vec.begin();
    for (; vit != vec.end(); vit++)
    {
        delete *vit;
    }

    return 0;
}

bool myCompare(Student *s1, Student *s2)
{
    return (s1->age) < (s2->age);
}





Student *setValue(void)
{
    Student *tmp = NULL;
    tmp = new Student;
    tmp->age = rand() %100 + 1;
    tmp->id = rand() %100 + 1;
    tmp->score = (rand() %100 + 1) / 4.0;
    for (int i = 0; i < 5; i++)
    {
        tmp->name[i] = 'a' + rand() % 26;
    }/* end of for (int i = 0; i < 5; i++) */

    return tmp;
}


void showStudent(Student &s)
{
    cout << "学号： " << s.id;
    cout << "  姓名： " << s.name;
    cout << "  年龄： " << s.age;
    cout << "  成绩： " << s.score << endl;


    return;
}




Student::Student()
{
    /* 无参构造 */
    this->id = 0;
    this->age = 0;
    this->score = 0.0;
    this->name = new char[100];
    memset(this->name, 0, 100);

    cout << "无参构造" << endl;
}

Student::Student(int id, char *name, int age, double score)
{
    /* 有参构造 */
    this->age = age;
    this->id = id;
    this->score = score;
    this->name = new char[100];
    memset(this->name, 0, 100);
    strcpy(this->name, name);

    cout << "有参构造" << endl;
}

Student::Student(const Student &ob)
{
    /* 拷贝构造 */
    this->age = ob.age;
    this->id = ob.id;
    this->score = ob.score;
    this->name = new char[100];
    memset(this->name, 0, 100);
    strcpy(this->name, ob.name);

    cout << "拷贝构造" << endl;
}

Student::~Student()
{
    /* 析构函数 */
    delete[] this->name;

    cout << "析构函数" << endl;
}
